package qnb._common;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import qnb._common.tools.DateTool;
import qnb._common.tools.StringTool;
import qnb._common.vo.ConditionVO;

public class ConditionTool {
	private static final Map<String,String> configJson=new HashMap<>();
	/**
	 * 把json字符串，化成sql标准的条件语句
	 * @param key 模块标识 符
	 * @param json 模块的查询条件 （要json格式的）
	 * @return
	 */
    public static String engineToSQLCondition(_ModuleKey key,String json) {
    	boolean noKey=null==key;
    	boolean hasJson=null != json&& json.length()>1;
    	
    	//没有条件字符 不管有没有key,直接返回空
    	if(!hasJson) {
    		return "";
    	}
    	//不是模型条件(没有模块标识，但有条件字符
    	if(noKey) {
    		return json;
    	}
    	//有模块标识符，但不符合json格式
        if (!json.contains("[")||!json.contains("{")) {
            return "";
        }
        //一切符合。开始解析 模型数据 成集合
        List<ConditionVO> list1 = StringTool.jsonStringToList(ConditionVO.class, json.replace("（", "(").replace("）", ")").replace("'", ""));
        if (null == list1 || list1.isEmpty()) {
            return "";
        }
        ConditionVO.formatConditionVO(key.toString(),list1);//格式化字符
        list1.get(0).setAndOr("");
        StringBuilder sb = new StringBuilder();
        for (ConditionVO obj : list1) {
            sb.append(toFormatOne(obj));
        }
        return sb.toString();
    }
    
    /**
	 * 通过 模块key，取得对应的 js 对象
	 * @param key
	 * @return
	 */
	public static String get(String key){
		String str=configJson.get(key);
		if(null==str) {
			Map<String,String> config=ConditionVO.getPropertiesConfig(key);
			if(null==config) {
				return "var conditionData=[]";
			}
			StringBuilder sb=new StringBuilder();
			//  [  {text:'名', value:'名'  }]
			for(Map.Entry<String,String> kv:config.entrySet()) {
				sb.append(",{text:'").append(kv.getKey()).append("',value:'"+kv.getKey()+"'}");
			}
			str=sb.length()>0?"var conditionData=["+sb.substring(1)+"]":"var conditionData=[]";
			configJson.put(key, str);
		}
		return str;
	}
	
	
    private static String toFormatOne(ConditionVO obj) {
    	//没有条件值时，表示此行仅是加括号
        if (null == obj.getConditionName() || obj.getConditionName().isEmpty()) {
            return obj.getParentheses();//返回括号
        }
        if(null==obj.getOperator()||null==obj.getAndOr()) { //非法的注入，或没有条件判断符或正确的连接符，应该中止继续的操作。
        	return null;
        }
        //当用户输入的是 xx天内 的[范围] 条件时
        if (obj.getConditionValue().endsWith("天内")) {
            String mydate = obj.getConditionValue().replace("天内", "");
            if (StringTool.isNumeric(mydate)) {
                int d = Integer.parseInt(mydate);
                LocalDate now = LocalDate.now();
                LocalDate start = now.minusDays(d > 0 ? d - 1 : 0);
                DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " BETWEEN '" + start.format(df) + "' AND '" + now.format(df) + " 23:59:59' ";
            }
        }
        //当用户输入的是时间 [范围] 条件时
        switch (obj.getConditionValue()) {
            case "当天时间":
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " BETWEEN '" + DateTool.getDate(new Date(), "yyyy-MM-dd")
                        + "' AND '" + DateTool.getDate(new Date(), "yyyy-MM-dd") + " 23:59:59' ";
            case "本月":
                String[] date = DateTool.currentMonth1_End("yyyy-MM-dd");
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " BETWEEN '" + date[0] + "' AND '" + date[1] + "'";
            case "本月时间":
                String[] date1 = DateTool.currentMonth1_End("yyyy-MM-dd");
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " BETWEEN '" + date1[0] + "' AND '" + date1[1] + " 23:59:59' ";
        }
      //当用户输入的是其他字符串时。
        switch (obj.getOperator()) {
            case "右包含": {
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " LIKE '" + defaultValue(obj.getConditionValue()) + "%' ";
            }
            case "包含": {
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " LIKE '%" + defaultValue(obj.getConditionValue()) + "%' ";
            }
            case "左包含": {
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " LIKE '%" + defaultValue(obj.getConditionValue()) + "' ";
            }
            case "在什么之中": {
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " IN('" + defaultValue(obj.getConditionValue()) + "')";
            }
            default: {// = <> > < >= <=  即  条件名 符号(如<) 条件值
                return obj.getParentheses() + obj.getAndOr()
                        + " " + obj.getConditionName() + " " + obj.getOperator() + " '" + defaultValue(obj.getConditionValue()) + "' ";
            }
        }
    }

    private static String defaultValue(String str) {
        if (null == str) {
            return "";
        }
        switch (str) {
            case "当天":
                return DateTool.getDate(new Date(), "yyyy-MM-dd");
//            case "当天时间":
//                return DateService.getDate(new Date(), "yyyy-MM-dd") + " 23:59:59";
        }
        return str;
    }
    
}
